                             - 347 -

    3.    .

           ,
         -
  ,      .
       ,  
  .   ,  
         ,    
      ,     
.      ,  
,      (      
,        ,       
     ).
    ,      -
       . 
         ,  
       ,     
  .      -
   ,         
   .        
 (   ).    
       ,    
 ,          
     .   
    .
          
,      .    -
,    ,    -
    ,    
   ,        .
        ,  
          .
        
  ,     
       -
 .

                             - 348 -

   6.3.1       .

            
        ,     
 .     ,  -
         ,
    "".    
     ,    -
,          .
        ,    
  1  .    -
 ,       , 
          .
            
/     .     ,
            .
-     ,   
     ,    -
 .

    .

            
LPRINT  PRINT#. LPRINT        ,  
  PRINT#     
      ,     OPEN "LPT1" AS
#1    OPEN "LPT3" AS #2.   LPRINT    
LPT1,     PRINT#     .
     /    
      LPRINT  PRINT#,      
   .       
           
  .      ,   , 
   ,    . -
  ,         
,        .  -
     ,  ,   
  80- (  ).   
      ,     
    .
           -
  .        80
,          .
,            
,    .     ,
           
,       WIDTH "LPT1",n
-  n    .    , 
      ,    
   ,     
 / .  ,   , 
        ,   
    ,    ,    ,
  / .
           -
  .    ,    
,  255, WIDTH  "LPT1",255.     
  ,      -

                             - 349 -

          /
     80  .      
             
,          .
     LPRINT      -
   .       -
,      LPRINT "The rain in Spain",     
     ,    X$ = "The rain
in  Spain":  LPRINT X$.       
    CHR$.      -
    , , LPRINT CHR$(10)  
      .    CHR$ -
    ASCII,      -
.        -
    .    ,    
  ,      ; 
    ,     -
    .     ,  -
  LPRINT      ,    
 PRINT    .   :

100 LPRINT S$;" and ";Y$     '  
110 LPRINT X, Y, Z           '  
120 LPRINT "The total is "; X  '   
130 LPRINT "The ";CHR$(27);CHR$(45);CHR$(1);"real";
            CHR$(27);CHR$(45);CHR$(0);" thing."
            '  

    PRINT#         ,  
 LPRINT,        -
             .
            .
 ,  :

100 OPEN "LPT1:" AS #2
110 PRINT #2,S$;" and ";Y$
120 PRINT #2,X, Y, Z
130 PRINT #2,"The total is "; X
140 PRINT #2,"The ";CHR$(27);CHR$(45);CHR$(1);"real";
            CHR$(27);CHR$(45);CHR$(0);" thing."

    .

    0    17H        .
    AL,     DX.      AH
   ,    
  .  [6.1.3]    . 
         , 
,     :

;---   LPT1
   MOV  CX,NUMBER_CHARS    ;CX     
   MOV  DX,0               ; LPT1
NEXT_CHAR:  MOV  AH,0      ;    
   MOV  AL,[BX]            ;BX    
   INT  17H                ; 
   TEST AH,8               ;  

                             - 350 -

   JNZ  PRNTR_ERROR        ;  
   INC  BX                 ; 
   LOOP NEXT_CHAR          ;  

      MS DOS      -
 5  21H.        DL  
.       LPT1     -
 .

;---   LPT1
   MOV  AH,5       ; 
   MOV  DL,CHAR    ;  
   INT  21H        ;   

            40H -
  21H.       ,   
             
[5.3.0].         -
    .    #4   
   BX.       LPT1,  
                
[6.1.4].  DS:DX     ,  CX -
   . :

;--- 120    LPT1
   MOV  AH,40H       ; 
   MOV  BX,4         ;   
   MOV  CX,120       ;  
   LEA  DX,PRTR_DATA ;DS:DX   
   INT  21H          ; 
   JC   PRTR_ERROR   ;  

        , 
 AX   5,        6 -
    .  ,   
     .

    .

       ,     
 ,        -
 .  ,     LPT1-3  
 8, 10   12        BIOS  ( 
0040:0000).           
         , 
    2 ,    .   
  0         -
  ,      ,    
 .        
   0.
         ,    ,
   ,         . 
   .       
    ,    
1    .    
6      1.      
   0    ,    
   ,         -
.

                             - 351 -

      ,        
        7  -
,     0,     -
  1,      .    -
   ,     -
       ,   -
  .
        LPT1   
BIOS       ,     -
 BX.        -
        3,    
  .

;---
   MOV  AX,40H          ;ES     BIOS
   MOV  ES,AX           ;
   MOV  DX,ES:[8]       ;  LPT1  DX
   MOV  BX,DATA_START   ;BX    
;--- 
NEXTCHAR:  MOV  AL,[BX]  ;   AL
   OUT  DX,AL           ; 
   INC  DX              ;DX    
   INC  DX              ; 
   MOV  AL,13           ;    
   OUT  DX,AL           ;  
   DEC  AL              ;  
   OUT  DX,AL           ; 
;---      
   DEC  DX              ;DX    
NOT_YET:  IN   AL,DX    ;  
   TEST AL,8            ;?
   JNZ  PRTR_ERROR      ;   
   TEST AL,80H          ; ?
   JZ   NOT_YET         ; ,  
   INC  BX              ;    
   DEC  DX              ;DX    
   JMP  NEXTCHAR        ;    

         4    ,  
  .    , 
        , -
      .  , -
          ;  
        ,   
   ( 6       
   1)        
.         -
         ,   
   ,       
.     ,   
 .      -
 ,    [7.1.8].
    ,   ,     
          .   
   ,    .    -
 /  AT    
 .       -
,    [2.1.7].      8253

                             - 352 -

,        ,   , 
    .      
 ,       -
   ,     .   
       
      ( 7)   
  ,      .

                             - 353 -

   6.3.2   .

         
,     ,    
 .      , -
      .   -
        IBM,      
27,77,0       -
    .     
     ,   
,      .      
       1/6  .
  ,       
       , 
       .     
       ,   
    .     -
  .
   ,       -
  , . -,   
          .  
   ,    -
  ,    . -
     .   
  80 (    ,  -
),            ,
    .   
      6,     -
        ,     
     .
          -
  480              
ASCII  0.          
 .         -
  ,     .
,       ,    
     ,     -
   .
         ,       12
,   61 ,  11   .   
  80-    8  .  -
 ,   6 ,  48  -
  .     11 , 
         4  
     4  ,   
     .    4  
  6    ,   5, 
   11.        -
 10 .         , 
 ,    1  ASCII 0,   -
   ,       ,  
  .  . 6-2   .
              
 .      , 
  ,      (.,     ).
   ,      
  ,      ,  
    .       
     .

                             - 354 -

    .

      , BUFFERPTR       -
,     ,   .

100 S$ = "This text will be printed with right justification
 using the printer alternately in text modes and graphics modes."
110 STRINGPTR = 1         '    S$
120 COLUMNS = 1           '   
130 SPACES = 0            '   
140 '''     
150 C$ = MID$(S$,STRINGPTR,1)  ' 
160 IF C$ <> " " THEN 190  '  ,  
170 LASTSPACE = COLUMNS   '  
180 SPACES = SPACES + 1   '  
190 COLUMNS = COLUMNS+1   '  
200 STRINGPTR = STRINGPTR + 1  '  
210 IF COLUMNS = 81 THEN 230   '   
220 GOTO 150              '   
230 IF C$ <> " " THEN 270 '   ,  
240 COLUMNS = 79          '    79
250 SPACES = SPACES - 1   '  
260 GOTO 340              '   
270 C$ = MID$(S$,STRINGPTR+1,1)  '   
280 IF C$ <> " " THEN 300 '  ,  
290 GOTO 340              '   
300 COLUMNS = COLUMNS - LASTSPACE  '   
310 STRINGPTR = STRINGPTR - COLUMNS + 1  ' 
320 COLUMNS = LASTSPACE - 1  '  
330 SPACES = SPACES - 1   '  
340 '''    
350 EXTRASPACES = 80 - COLUMNS  '    
360 TOTALSPACES = EXTRASPACES + SPACES   '  
370 TOTALDOTS = 6*TOTALSPACES   '  
380 DOTSPERSPC = TOTALDOTS/SPACES '    
390 EXTRADOTS = TOTALDOTS MOD SPACES  '  
400 '''     
410 OPEN "LPT1:" AS #1    ' 
420 PRINTPTR = 1          '    
430 C$ = MID$(S$,PRINTPTR,1)  ' 
440 PRINTPTR = PRINTPTR + 1   ' 
450 IF C$ = " " THEN 500  ' ,    
460 PRINT #1, C$          '  
470 IF PRINTPTR = COLUMNS + 1 THEN 590  '   
480 GOTO 430              '   
490 '''   
500 PRINT #1, CHR$(27) + "K";  '   
510 NUMBERDOTS = DOTSPERSPC  '   ASCII 0
520 IF EXTRADOTS = 0 THEN 550  '   , 
530 NUMBERDOTS = DOTSPERSPC + 1  '  
540 EXTRADOTS = EXTRADOTS - 1  '   
550 PRINT #1, CHR$(NUMBERDOTS);  '   
560 PRINT #1, CHR$(0);    '
570 FOR N = 1 TO NUMBERDOTS: PRINT #1, CHR$(0): NEXT
580 GOTO 430              ' ,   . 
590 PRINT #1, CHR$(13)    '    

                             - 355 -

    .

       ,  
  .       ,   -
  ,   ,    -
  ,      .   
      ,   -
   .

                             - 356 -

   6.3.3  .

     ,      
,         -
.      IBM      ,
     27,78,1,   -
27,78,0.   ,      ,
        (  
 ).   ,    
    .
    ,       
          .   
          
,             
   ,    ,      
.      -
   ,      -
,    ,    
         
.        -
 . ,    IBM  -
        
  ,    -
 .
             
       .    
         (.  [6.3.4]).
 ,        ASCII,  -
       ,     
       . 
         -
.           
  ,       
 .

    .

           , 
       .  
     FONTWIDTH  -
 .

100 '''   
110 DIM FONTWIDTH(127)     '   
120 OPEN "FONTS" FOR INPUT AS #1  '  
130 FOR N = 32 TO 127      '    32-127
140 INPUT #1, FONTWIDTH(N) '   
150 NEXT                   ' 
160 '''     
170 CHARPTR = 0            '  
180 LINE$ = ""             '   
190 LINELENGTH = 0         '   
200 WHILE LINELENGTH <480  '   
210 C$ = PEEK(BUFFERPTR+CHARPTR)  '    
220 LINELENGTH = LINELENGTH + FONTWIDTH(ASC(C$))
230 LINE$ = LINE$+C$       '   
240 CHARPTR = CHARPTR+1    ' 
250 WEND                   '   

                             - 357 -

260 '''       
270 IF C$ = "" THEN 310    '  ,  
280 FOR N = LEN(LINE$) TO 1 STEP -1  '   
290 IF MID$(LINE$,N,1) = " " THEN 310 '  ?
300 NEXT                   ' ,   
310 LINELENGTH = N - 1     ' ,   - 
320 '''     
330 LPRINT CHR$(27);CHR$(78);CHR$(1);  ' 
340 FOR N = 1 TO LINELENGTH  '  
350 LPRINT PEEK(BUFFERPTR+N-1);  ' 
360 NEXT                   '    

    .

           -
    .    
   ,       
  XLAT.    AL, DS:DX 
  ,     XLAT.  
    AL:

;---  
   LEA  SI,DATA_BUFFER     ;   
   LEA  BX,WIDTH_TABLE     ;   
   MOV  AL,[SI]            ;  
   XLAT WIDTH_TABLE        ;    AL

                             - 358 -

   6.3.4   .

         -
 IBM,       -
 .       
           ,
    .   ,  -
   ,       -
           ,
     .
           .  
    ,    -
        , -
  .   ,      
 ,  ASCII    205,   
  00100100     480   . 
         , 
6/480   1/80 .        
      27,75.  
     ,  
   ,     . ,  
6    ,          
 2  5 (4 + 32 = 36).     -
 : 27, 75, 6, 0, 36, 36, 36, 36, 36, 36.   
       -
;        , 
    .
      ,     
     .     -
 ,     ,   
   12  ,          4
   .    -
    ,        
12 .       8
,         
     ,       
.        (ASCII 10) 
 .   ,    -
    8,   4 .      -
    ,     ,  -
          0,  
 .
             
 27, 65, 4, 27, 50,       - 27, 65, 8, 27,
50.         .    
    ,   
,      .   
 ,          
         (ASCII  32).     
    ,   -
    ,      ASCII 
   . :

    1    2    3    4    5    6    7    8    9   10

 ASCII        205  32   98   111  114  105  110  103  32   205
 2-    205  32   32   32   32   32   32   32   32   205

                             - 359 -

           
     .       
        0, 255, 0, 255, 0,
0,     - 0, 15, 0, 15, 0, 0.  ,    
          4   ,
   .
   ,    ,       -
     ,   , 
     ,    ASCII.     
,        -
.      .    
 ,  6       -
,        6 
  .       
  .         
   ASCII     .  
     ,    
    .      
    .    ,   
   (..    ,   -
     ).       
,             
            ,
    .     
     .   .  6-3   
.

    .

           ,   -
     .    -
   ,         
 ,    FOR/NEXT   325   505.
          
  ,            
 .

100 '''     (  178  179)
110 DATA 0, 0, 255, 0, 0, 0
120 DATA 4, 4, 255, 0, 0, 0
130 '''    
140 DATA 0, 0, 15, 0, 0, 0
150 DATA 0, 0, 15, 0, 0, 0
160 '''    
170 DIM FIRSTPASS$(45)       ' 
180 FOR N = 1 TO 2           ' 
190 Y$ = ""                  'Y$  6   
200 FOR M=1 TO 6: READ X: Y$ = Y$+CHR$(X): NEXT
210 FIRSTPASS$(N) = Y$: NEXT '  
220 '''    
230 DIM SECONDPASS$(45)      '
240 FOR N = 1 TO 2           '
250 Y$ = ""                  '
260 FOR M=1 TO 6: READ X: Y$ = Y$+CHR$(X): NEXT
270 SECONDPASS$(N) = Y$: NEXT '
280 '''   
290 TEXT$ = "Here is one column"+CHR$(179)+"Here is the
             second column"

                             - 360 -

300 TEMP$ = STRING$(80,32)   '   2- 
310 GRAPH$ = CHR$(27)+CHR$(75)+CHR$(6)+CHR$(0)
320 OPEN "LPT1:" AS #1       ' 
330 FOR N = 1 TO LEN(TEXT$)  '   
340 C$ = MID$(TEXT$,N,1)     '    
350 IF C$ < CHR$(128) THEN PRINT #1,C$;: GOTO 400
360 ''',     - 
370 PRINT #1,GRAPH$;         '   
380 PRINT #1,FIRSTPASS$(ASC(C$) - 178); 1- 
390 MID$(TEMP$,N) = C$       '   2- 
400 NEXT
410 '''  8      
420 PRINT #1,CHR$(27)+CHR$(65)+CHR$(4)+CHR$(141);
430 Z$ = ""                  'Z$    2- 
440 FOR N = 1 TO LEN(TEXT$)  '   
450 C$ = MID$(TEMP$,N,1)     '    
460 IF C$ = CHR$(32) THEN Z$ = Z$+" ": GOTO 480
470 Z$ = Z$+GRAPH$+SECONDPASS$(ASC(C$) - 178)
480 NEXT
490 PRINT #1,Z$              '   
500 PRINT #1,CHR$(10);       '    

    .

           , 
     .      
 ,      ,  ,
              
   ASCII.       -
    XLAT,      
    .

                             - 361 -

   6.3.5     ( ).

            ,  
            
    ,   
   .       
      80 ,  
     ,    -
    .     
 ,    ,  -
             
      .   -
     ,   
  [6.3.4].
           -
.             
 ( [4.1.3]   ,  -
  ).       -
    ,    -
        .   
    ,     ,
      :    
        -
.        [6.3.4]  
     .     ,  
        
    ,      ,  
          ,
  .         
     .       
        
  ,      .
       .    
   ,      -
    8  .    
  ,      .  6-4.  
  8   ,  ,   -
   8*8.      
   ,    .
     ,        
 .     ,   
  1:1,       -
 5:6 (    -
          ).   
,       - -
  ,    -
     ,      , 
  (,     
    ).          
,     .   -
     ,     
    ,    IBM    
       .

                             - 362 -

    .

           -
,   :

 10 OPEN "LPT1:" AS #1          ' 
 20 DEF SEG = &HB000            '  
 30 PRINT #1,CHR$(13)           '  
 40 FOR G = 0 TO 3998 STEP 2    '   
 50 PRINT #1,CHR$(PEEK(G));     '     
 60 NEXT                        '  

        
  .      (, BYTE$) 
,      8*8 .     
 (VERTICAL$)       ,   
      :

500 FOR M = 0 TO 7       '  
510 FOR N = 0 TO 7       '  
520 X = ASC(BYTES(N))    '  
530 Y = 2*(7 - M)        '    
540 Z = X AND Y          '    
550 IF Z <> 0 THEN VERTICAL$(M) = CHR$(ASC(VERTICAL$(M) OR 2*N)
                         '  ,   
                         '   2- 
560 NEXT N               ' 
570 NEXT M               ' 

    .

         .
 ,        ,
      (  -
,       ,   -
).    ,  8     -
 CX, DX, BP  DI.       AL, 
  AH   CL, CH, DL  DH.  
  AL  AH         4 , 
CX    DX   DX  BP,      
.            8- 
     ,     -
   ,     
     CL.         
,         
 .    8     -
      BUFFER.    0  AX, CX, DX, BP 
DI. :

   LEA  BX,BUFFER    ;   
   MOV  SI,0         ;   
GET_BYTE:  MOV  AL,[BX][SI]     ; 
DO_HALF:   XCNG AH,CL           ; CL, CH, DL  DH
   SHL  AX,1         ;   AL
   XCNG AH,CL        ;
   XCNG AH,CH        ;
   SHL  AX,1         ;

                             - 363 -

   XCNG AH,CH        ;
   XCNG AH,DL        ;
   SHL  AX,1         ;
   XCNG AH,DL        ;
   XCNG AH,DH        ;
   SHL  AX,1         ;
   XCNG AH,DH        ;
;---    
   XCNG CX,BP        ;  CX  DX
   XCNG DX,DI        ;
   CMP  SI,7         ;   ,  
   JE   PRINT_BYTES  ;
   INC  SI           ;    
   JMP  SHORT GET_BYTE    ;
;--- 
PRINT_BYTES:   PUSH DX    ; DX
   MOV  AH,5         ;   
   MOV  DL,27        ; Esc
   INT  21H          ; 
   MOV  DL,75        ;  
   INT  21H          ; 
   MOV  DL,6         ;  6 
   INT  21H          ;
   MOV  DL,0         ;
   INT  21H          ;
   CALL PRINT_2_BYTES  ;  CX
   POP  CX           ;
   CALL PRINT_2_BYTES  ;  DX
   MOV  CX,BP        ;
   CALL PRINT_2_BYTES  ;  BP
   MOV  DX,DI        ;
   CALL PRINT_2_BYTES  ;  DI
    .
   (      )
    .
PRINT_2_BYTES:    PROC  NEAR
   MOV  AH,5         ; 
   MOV  DL,CL        ; CL
   INT  21H          ;
   MOV  DL,CH        ; CH
   INT  21H          ;
   RET
PRINT_2_BYTES     ENDP